home *** CD-ROM | disk | FTP | other *** search
- /* GadTools layout toolkit
- **
- ** Copyright © 1993-1995 by Olaf `Olsen' Barthel
- ** Freely distributable.
- */
-
- #include "gtlayout_global.h"
-
- VOID __regargs
- LTP_LayoutGroup(LayoutHandle *Handle,ObjectNode *Group)
- {
- if(!Handle -> Failed)
- {
- ObjectNode *Node;
- ObjectNode *ReturnKey;
- ObjectNode *EscKey;
- ObjectNode *CursorKey;
- ObjectNode *TabKey;
- ObjectNode *ActiveString;
- LONG Left;
- LONG Top;
- LONG Width;
- LONG Height;
- BOOLEAN DefaultCorrection;
-
- Left = 0;
- Top = 0;
- ReturnKey = NULL;
- EscKey = NULL;
- CursorKey = NULL;
- TabKey = NULL;
- ActiveString = NULL;
- DefaultCorrection = FALSE;
-
- if(Group -> Special . Group . SameSize)
- {
- LONG MaxWidth = 0;
- LONG MaxHeight = 0;
-
- SCANGROUP(Group,Node)
- {
- LTP_DetermineSize(Handle,Node);
-
- if(Node -> Type == BUTTON_KIND)
- {
- if(Node -> Special . Button . ReturnKey)
- ReturnKey = Node;
- else
- {
- if(Node -> Special . Button . EscKey)
- EscKey = Node;
- }
-
- DefaultCorrection |= Node -> Special . Button . DefaultCorrection;
- }
-
- if(Node -> Type == CYCLE_KIND)
- {
- if(Node -> Special . Cycle . TabKey)
- TabKey = Node;
- }
-
- #if defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)
- if(Node -> Type == POPUP_KIND)
- {
- if(Node -> Special . Popup . TabKey)
- TabKey = Node;
- }
- #endif
-
- #if defined(DO_TAB_KIND) && defined(DO_BOOPSI_KIND)
- if(Node -> Type == TAB_KIND)
- {
- if(Node -> Special . Tab . TabKey)
- TabKey = Node;
- }
- #endif
-
- if(Node -> Type == MX_KIND)
- {
- if(Node -> Special . Radio . TabKey)
- TabKey = Node;
- }
-
- if(Node -> Type == PASSWORD_KIND || Node -> Type == STRING_KIND || Node -> Type == FRACTION_KIND)
- {
- if(Node -> Special . String . Activate)
- ActiveString = Node;
- }
-
- if(Node -> Type == INTEGER_KIND)
- {
- if(Node -> Special . Integer . Activate)
- ActiveString = Node;
- }
-
- if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . CursorKey)
- CursorKey = Node;
-
- if(Node -> Width > MaxWidth)
- MaxWidth = Node -> Width;
-
- if(Node -> Height > MaxHeight)
- MaxHeight = Node -> Height;
- }
-
- if(ReturnKey || DefaultCorrection)
- {
- SCANGROUP(Group,Node)
- {
- #ifdef OLD_STYLE_DEFAULT_KEY
- Node -> GroupIndent = TRUE;
-
- Node -> Width += 4 + 4;
- Node -> Height += 2 + 2;
- #else
- Node -> Width += 1 + 1;
- Node -> Height += 1 + 1;
- #endif
- if(Node -> Width > MaxWidth)
- MaxWidth = Node -> Width;
-
- if(Node -> Height > MaxHeight)
- MaxHeight = Node -> Height;
- }
- }
-
- SCANGROUP(Group,Node)
- {
- if(Node -> Width < MaxWidth && Node -> Type != YBAR_KIND && Node -> Type != CHECKBOX_KIND)
- {
- if(Node -> Type == GROUP_KIND && !Node -> Special . Group . NoIndent)
- Node -> Special . Group . ExtraLeft += (MaxWidth - Node -> Width) / 2;
-
- Node -> Width = MaxWidth;
- }
-
- if(Node -> Height < MaxHeight && Node -> Type != XBAR_KIND && Node -> Type != CHECKBOX_KIND)
- {
- if(Node -> Type == GROUP_KIND && !Node -> Special . Group . NoIndent)
- Node -> Special . Group . ExtraTop += (MaxHeight - Node -> Height) / 2;
-
- Node -> Height = MaxHeight;
- }
- }
- }
- else
- {
- SCANGROUP(Group,Node)
- {
- LTP_DetermineSize(Handle,Node);
-
- if(Node -> Type == BUTTON_KIND)
- {
- if(Node -> Special . Button . ReturnKey)
- ReturnKey = Node;
- else
- {
- if(Node -> Special . Button . EscKey)
- EscKey = Node;
- }
-
- DefaultCorrection |= Node -> Special . Button . DefaultCorrection;
- }
-
- if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . CursorKey)
- CursorKey = Node;
-
- if(Node -> Type == CYCLE_KIND)
- {
- if(Node -> Special . Cycle . TabKey)
- TabKey = Node;
- }
-
- #if defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)
- if(Node -> Type == POPUP_KIND)
- {
- if(Node -> Special . Popup . TabKey)
- TabKey = Node;
- }
- #endif
-
- #if defined(DO_TAB_KIND) && defined(DO_BOOPSI_KIND)
- if(Node -> Type == TAB_KIND)
- {
- if(Node -> Special . Tab . TabKey)
- TabKey = Node;
- }
- #endif
-
- if(Node -> Type == MX_KIND)
- {
- if(Node -> Special . Radio . TabKey)
- TabKey = Node;
- }
- }
-
- if(ReturnKey || DefaultCorrection)
- {
- SCANGROUP(Group,Node)
- {
- #ifdef OLD_STYLE_DEFAULT_KEY
- Node -> GroupIndent = TRUE;
-
- Node -> Width += 4 + 4;
- Node -> Height += 2 + 2;
- #else
- Node -> Width += 1 + 1;
- Node -> Height += 1 + 1;
- #endif
- }
- }
- }
-
- if(Group -> Special . Group . Horizontal)
- {
- LONG x,y,w,MaxTop = 0,MaxWidth = 0,MaxHeight = 0,Count = 0;
-
- if(Group -> Node . mln_Pred -> mln_Pred && Group -> Special . Group . LastAttributes)
- {
- ObjectNode *LastGroup = (ObjectNode *)Group -> Node . mln_Pred;
-
- MaxTop = LastGroup -> Special . Group . MaxOffset;
- MaxHeight = LastGroup -> Special . Group . MaxSize;
- }
-
- SCANGROUP(Group,Node)
- {
- if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
- {
- if(!Group -> Special . Group . Paging && Count++)
- {
- if(Node -> ExtraSpace > 0)
- x = Left + Node -> ExtraSpace * Handle -> InterWidth;
- else
- {
- if(Node -> ExtraSpace < 0)
- x = Left - Node -> ExtraSpace;
- else
- x = Left + Handle -> InterWidth;
- }
- }
- else
- x = Left;
-
- y = Top;
- w = Node -> Width;
-
- switch(Node -> LabelPlace)
- {
- case PLACE_LEFT:
-
- if(Node -> Type == MX_KIND)
- {
- x += Node -> Special . Radio . LabelWidth + INTERWIDTH;
-
- if(Node -> Label)
- {
- if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
- x += Node -> LabelWidth + INTERWIDTH;
- else
- w += INTERWIDTH + Node -> LabelWidth;
- }
- }
- else
- {
- if(Node -> Label || (Node -> Type == BOX_KIND && Node -> Special . Box . Labels))
- x += Node -> LabelWidth + INTERWIDTH;
- }
-
- break;
-
- case PLACE_RIGHT:
-
- if(Node -> Type == MX_KIND)
- {
- w += INTERWIDTH + Node -> Special . Radio . LabelWidth;
-
- if(Node -> Label)
- {
- if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
- x += Node -> LabelWidth + INTERWIDTH;
- else
- w += INTERWIDTH + Node -> LabelWidth;
- }
- }
- else
- {
- if(Node -> Label || (Node -> Type == BOX_KIND && Node -> Special . Box . Labels))
- w += INTERWIDTH + Node -> LabelWidth;
- }
-
- break;
-
- case PLACE_ABOVE:
-
- if(Node -> Label || (Node -> Type == BOX_KIND && Node -> Special . Box . Labels))
- {
- if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . TextAttr && Node -> Special . List . FlushLabelLeft)
- y += Node -> Special . List . FixedGlyphHeight + INTERHEIGHT;
- else
- y += Handle -> RPort . TxHeight + INTERHEIGHT;
- }
-
- break;
-
- case PLACE_BELOW:
-
- break;
-
- case PLACE_IN:
-
- break;
- }
-
- if(Node -> Type == SLIDER_KIND)
- {
- if(Node -> Special . Slider . LevelPlace == PLACETEXT_RIGHT && Node -> Special . Slider . LevelFormat)
- w += INTERWIDTH + Node -> Special . Slider . LevelWidth;
-
- if(Node -> Special . Slider . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT && Node -> Special . Slider . LevelFormat)
- x += INTERWIDTH + Node -> Special . Slider . LevelWidth;
- }
-
- #ifdef DO_LEVEL_KIND
- if(Node -> Type == LEVEL_KIND)
- {
- if(Node -> Special . Level . LevelPlace == PLACETEXT_RIGHT)
- w += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
-
- if(Node -> Special . Level . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT)
- x += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
- }
- #endif /* DO_LEVEL_KIND */
-
- if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . ExtraLabelWidth)
- x += Node -> Special . List . ExtraLabelWidth + INTERWIDTH;
-
- if(y > MaxTop)
- MaxTop = y;
-
- if(Node -> Height > MaxHeight)
- MaxHeight = Node -> Height;
-
- if(Node -> LabelPlace == PLACE_BELOW && Node -> Label)
- {
- LONG Height;
-
- if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . TextAttr && Node -> Special . List . FlushLabelLeft)
- Height = Node -> Height + INTERHEIGHT + Node -> Special . List . FixedGlyphHeight;
- else
- Height = Node -> Height + INTERHEIGHT + Handle -> RPort . TxHeight;
-
- if(Height > MaxHeight)
- MaxHeight = Height;
- }
- else
- {
- if(Node -> Height > MaxHeight)
- MaxHeight = Node -> Height;
- }
-
- if(x + w > MaxWidth)
- MaxWidth = x+w;
-
- Node -> Left = x;
-
- if(!Group -> Special . Group . Paging)
- Left = x + w;
- }
- }
-
- SCANGROUP(Group,Node)
- {
- if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
- {
- Node -> Top = MaxTop;
-
- if(Node -> Height < MaxHeight)
- {
- #ifdef DO_BOOPSI_KIND
- if((Node -> Type == PALETTE_KIND && !Node -> Special . Palette . UsePicker) || Node -> Type == LISTVIEW_KIND || (Node -> Type == BOOPSI_KIND && !Node -> Special . BOOPSI . ExactHeight))
- #else
- if((Node -> Type == PALETTE_KIND && !Node -> Special . Palette . UsePicker) || Node -> Type == LISTVIEW_KIND || Node -> Type == BOOPSI_KIND)
- #endif /* DO_BOOPSI_KIND */
- Node -> Height = MaxHeight;
- else
- {
- if(Node -> Type == GROUP_KIND)
- {
- if(Node -> Special . Group . Spread)
- LTP_Spread(Handle,Node,Node -> Width,MaxHeight);
- else
- {
- if(!Node -> Special . Group . NoIndent)
- Node -> Special . Group . ExtraTop += (MaxHeight - Node -> Height) / 2; /* !FIX! */
- }
-
- Node -> Height = MaxHeight;
- }
- }
- }
- }
- }
-
- Group -> Special . Group . MaxOffset = MaxTop;
- Group -> Special . Group . MaxSize = MaxHeight;
-
- if(Group -> Special . Group . Paging)
- Width = MaxWidth;
- else
- Width = Left;
-
- Height = MaxTop + MaxHeight;
- }
- else
- {
- LONG x,y,w,MaxLeft = 0,MaxWidth = 0,MaxHeight = 0,Count = 0;
-
- if(Group -> Node . mln_Pred -> mln_Pred && Group -> Special . Group . LastAttributes)
- {
- ObjectNode *LastGroup = (ObjectNode *)Group -> Node . mln_Pred;
-
- MaxLeft = LastGroup -> Special . Group . MaxOffset;
- MaxWidth = LastGroup -> Special . Group . MaxSize;
- }
-
- SCANGROUP(Group,Node)
- {
- if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
- {
- if(!Group -> Special . Group . Paging && Count++)
- {
- if(Node -> ExtraSpace > 0)
- y = Top + Node -> ExtraSpace * Handle -> InterHeight;
- else
- {
- if(Node -> ExtraSpace < 0)
- y = Top - Node -> ExtraSpace;
- else
- y = Top + Handle -> InterHeight;
- }
- }
- else
- y = Top;
-
- w = Node -> Width;
- x = Left;
-
- switch(Node -> LabelPlace)
- {
- case PLACE_LEFT:
-
- if(Node -> Type == MX_KIND)
- {
- x += Node -> Special . Radio . LabelWidth + INTERWIDTH;
-
- if(Node -> Label)
- {
- if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
- x += Node -> LabelWidth + INTERWIDTH;
- }
- }
- else
- {
- if(Node -> Label || (Node -> Type == BOX_KIND && Node -> Special . Box . Labels))
- x += Node -> LabelWidth + INTERWIDTH;
- }
-
- break;
-
- case PLACE_RIGHT:
-
- if(Node -> Type == MX_KIND)
- {
- w += INTERWIDTH + Node -> Special . Radio . LabelWidth;
-
- if(Node -> Label)
- {
- if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
- x += Node -> LabelWidth + INTERWIDTH;
- else
- w += INTERWIDTH + Node -> LabelWidth;
- }
- }
- else
- {
- if(Node -> Label || (Node -> Type == BOX_KIND && Node -> Special . Box . Labels))
- w += INTERWIDTH + Node -> LabelWidth;
- }
-
- break;
-
- case PLACE_ABOVE:
-
- if(Node -> Label || (Node -> Type == BOX_KIND && Node -> Special . Box . Labels))
- {
- if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . TextAttr && Node -> Special . List . FlushLabelLeft)
- y += Node -> Special . List . FixedGlyphHeight + INTERHEIGHT;
- else
- y += Handle -> RPort . TxHeight + INTERHEIGHT;
- }
-
- break;
-
- case PLACE_BELOW:
-
- break;
-
- case PLACE_IN:
-
- break;
- }
-
- if(Node -> Type == SLIDER_KIND)
- {
- if(Node -> Special . Slider . LevelPlace == PLACETEXT_RIGHT && Node -> Special . Slider . LevelFormat)
- w += INTERWIDTH + Node -> Special . Slider . LevelWidth;
-
- if(Node -> Special . Slider . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT && Node -> Special . Slider . LevelFormat)
- x += INTERWIDTH + Node -> Special . Slider . LevelWidth;
- }
-
- #ifdef DO_LEVEL_KIND
- if(Node -> Type == LEVEL_KIND)
- {
- if(Node -> Special . Level . LevelPlace == PLACETEXT_RIGHT)
- w += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
-
- if(Node -> Special . Level . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT)
- x += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
- }
- #endif /* DO_LEVEL_KIND */
- if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . ExtraLabelWidth)
- x += Node -> Special . List . ExtraLabelWidth + INTERWIDTH;
-
- if(x > MaxLeft)
- MaxLeft = x;
-
- if(w > MaxWidth)
- MaxWidth = w;
-
- if(y + Node -> Height > MaxHeight)
- MaxHeight = y + Node -> Height;
-
- Node -> Top = y;
-
- if(!Group -> Special . Group . Paging)
- Top = y + Node -> Height;
-
- if(Node -> LabelPlace == PLACE_BELOW && Node -> Label)
- {
- if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . TextAttr && Node -> Special . List . FlushLabelLeft)
- Top += INTERHEIGHT + Node -> Special . List . FixedGlyphHeight;
- else
- Top += INTERHEIGHT + Handle -> RPort . TxHeight;
- }
- }
- }
-
- SCANGROUP(Group,Node)
- {
- if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
- {
- Node -> Left = MaxLeft;
-
- if(Node -> Type == GROUP_KIND && Group -> Special . Group . Paging && !Node -> Special . Group . NoIndent)
- Node -> Special . Group . ExtraTop += (MaxHeight - Node -> Height) / 2;
-
- if(Node -> Width < MaxWidth)
- {
- if(Node -> Type == GROUP_KIND)
- {
- if(Node -> Special . Group . Spread)
- LTP_Spread(Handle,Node,MaxWidth,Node -> Height);
- else
- {
- if(!Node -> Special . Group . NoIndent)
- Node -> Special . Group . ExtraLeft += (MaxWidth - Node -> Width) / 2;
- }
-
- Node -> Width = MaxWidth;
- }
- else
- {
- #ifdef DO_BOOPSI_KIND
- if((Node -> Type == PALETTE_KIND && !Node -> Special . Palette . UsePicker) || (Node -> Type == BOOPSI_KIND && !Node -> Special . BOOPSI . ExactWidth) || Node -> Type == LISTVIEW_KIND || Node -> Type == TEXT_KIND || Node -> Type == GAUGE_KIND || Node -> Type == NUMBER_KIND || Node -> Type == CYCLE_KIND || LIKE_STRING_KIND(Node) || Node -> Type == INTEGER_KIND || Node -> Type == BUTTON_KIND || Node -> Type == SLIDER_KIND || Node -> Type == BOX_KIND || Node -> Type == SCROLLER_KIND || Node -> Type == LEVEL_KIND || Node -> Type == POPUP_KIND || Node -> Type == TAB_KIND)
- #else
- if((Node -> Type == PALETTE_KIND && !Node -> Special . Palette . UsePicker) || Node -> Type == LISTVIEW_KIND || Node -> Type == TEXT_KIND || Node -> Type == GAUGE_KIND || Node -> Type == NUMBER_KIND || Node -> Type == CYCLE_KIND || LIKE_STRING_KIND(Node) || Node -> Type == INTEGER_KIND || Node -> Type == BUTTON_KIND || Node -> Type == SLIDER_KIND || Node -> Type == BOX_KIND || Node -> Type == SCROLLER_KIND || Node -> Type == LEVEL_KIND)
- #endif /* DO_BOOPSI_KIND */
- {
- if((Node -> Type != LISTVIEW_KIND || !Node -> Special . List . LockSize) && (Node -> Type != TEXT_KIND || !Node -> Special . Text . LockSize))
- {
- if(Node -> Label && Node -> LabelPlace == PLACE_RIGHT)
- Node -> Width = MaxWidth - (INTERWIDTH + Node -> LabelWidth);
- else
- Node -> Width = MaxWidth;
- }
- }
- else
- {
- if(Node -> Type == SLIDER_KIND)
- {
- if(Node -> Special . Slider . LevelPlace == PLACE_RIGHT)
- {
- if(Node -> Width + Node -> Special . Slider . LevelWidth + INTERWIDTH < MaxWidth && Node -> Special . Slider . LevelFormat)
- Node -> Width = MaxWidth - (Node -> Special . Slider . LevelWidth + INTERWIDTH);
- }
- else
- Node -> Width = MaxWidth;
- }
-
- #ifdef DO_LEVEL_KIND
- if(Node -> Type == LEVEL_KIND)
- {
- if(Node -> Special . Level . LevelPlace == PLACE_RIGHT)
- {
- if(Node -> Width + Node -> Special . Level . MaxLevelWidth + INTERWIDTH < MaxWidth)
- Node -> Width = MaxWidth - (Node -> Special . Level . MaxLevelWidth + INTERWIDTH);
- }
- else
- Node -> Width = MaxWidth;
- }
- #endif /* DO_LEVEL_KIND */
- }
- }
- }
- }
- }
-
- Group -> Special . Group . MaxOffset = MaxLeft;
- Group -> Special . Group . MaxSize = MaxWidth;
-
- if(Group -> Special . Group . Paging)
- Height = MaxHeight;
- else
- Height = Top;
-
- Width = MaxLeft + MaxWidth;
- }
-
- Group -> Left = 0;
- Group -> Top = 0;
- Group -> Width = Width;
- Group -> Height = Height;
-
- if(Group -> Label || Group -> Special . Group . Frame)
- {
- if(Group -> Label)
- {
- Group -> LabelWidth = LT_LabelWidth(Handle,Group -> Label) + 2 * Handle -> GlyphWidth;
-
- Group -> Height += Handle -> RPort . TxHeight + 2 * Handle -> InterHeight + 3;
- }
- else
- {
- Group -> LabelWidth = 0;
-
- Group -> Height += 2 + 2 * Handle -> InterHeight + 3;
- }
-
- if(Group -> LabelWidth > Group -> Width)
- {
- if(!Node -> Special . Group . NoIndent)
- Group -> Special . Group . ExtraLeft += (Group -> LabelWidth - Group -> Width) / 2;
-
- Group -> Width = Group -> LabelWidth;
- }
-
- Group -> Width += 2 * (Handle -> GlyphWidth + Handle -> InterWidth) + 8;
- }
-
- if(Group -> Special . Group . IndentX)
- {
- Group -> Width += 2 * Handle -> InterWidth;
- Group -> Special . Group . ExtraLeft += Handle -> InterWidth;
- }
-
- if(Group -> Special . Group . IndentY)
- {
- Group -> Height += 2 * Handle -> InterHeight;
- Group -> Special . Group . ExtraTop += Handle -> InterHeight;
- }
-
- if(ReturnKey)
- Handle -> ReturnKey = ReturnKey;
-
- if(EscKey)
- Handle -> EscKey = EscKey;
-
- if(CursorKey)
- Handle -> CursorKey = CursorKey;
-
- if(TabKey)
- Handle -> TabKey = TabKey;
-
- if(ActiveString)
- Handle -> ActiveString = ActiveString;
- }
- }
-